package com.kk.demo.unsface.third;

import java.nio.ByteBuffer;
import java.util.Random;

public class TestUnsafeDirectByteBufferslice {

    public static void main(String[] args) {
        UnsafeDirectByteBuffer unsafe = new UnsafeDirectByteBuffer();

        TestUnsafeDirectByteBufferslice test = new TestUnsafeDirectByteBufferslice();

        ByteBuffer buffer = unsafe.getDirectByteBuffer(10240);

        System.out.println("进行int的存取操作");
        // 进行测试int的存取
        test.printIntInOut(10, 1000, unsafe, buffer);
        System.out.println();

        System.out.println("进行long的存取操作");
        // i测试long的存取
        test.printLongInOut(10, 1000, unsafe, buffer);
        System.out.println();
        // 进行gc的调用

        System.out.println("进行char的存取操作");
        // i测试long的存取
        test.printChargInOut(10, 1000, unsafe, buffer);

        ByteBuffer buffer2 = unsafe.slice(buffer);

        System.out.println("进行slice方法后......");

        System.out.println("进行int的存取操作");
        // 进行测试int的存取
        test.printIntInOut(10, 1000, unsafe, buffer2);
        System.out.println();

        System.out.println("进行long的存取操作");
        // i测试long的存取
        test.printLongInOut(10, 1000, unsafe, buffer2);
        System.out.println();

        System.out.println("进行char的存取操作");
        // i测试long的存取
        test.printChargInOut(10, 1000, unsafe, buffer2);

        System.out.println(buffer2);

    }

    /**
     * 进行int的数据的存取
    * 方法描述
    * @param start
    * @param end
    * @param unsafe
    * @创建日期 2016年12月4日
    */
    public void printIntInOut(int start, int end, UnsafeDirectByteBuffer unsafe, ByteBuffer buffer) {
        for (int i = start; i < end; i++) {
            buffer.putInt(100 + i);
        }

        buffer.flip();

        for (int i = start; i < end; i++) {
            System.out.print(buffer.getInt() + "\t");
        }

        buffer.clear();
    }

    /**
     * 进行long的数据的存取
     * 方法描述
     * @param start
     * @param end
     * @param unsafe
     * @创建日期 2016年12月4日
     */
    public void printLongInOut(long start, long end, UnsafeDirectByteBuffer unsafe, ByteBuffer buffer) {
        for (long i = start; i < end; i++) {
            buffer.putLong(Long.MAX_VALUE - i);
        }

        buffer.flip();

        for (long i = start; i < end; i++) {
            System.out.print(buffer.getLong() + "\t");
        }

        buffer.clear();
    }

    static final char[] value = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'r', 'm', 'n' };

    static final Random RAND = new Random();

    /**
     * 进行long的数据的存取
     * 方法描述
     * @param start
     * @param end
     * @param unsafe
     * @创建日期 2016年12月4日
     */
    public void printChargInOut(int start, int end, UnsafeDirectByteBuffer unsafe, ByteBuffer buffer) {
        for (long i = start; i < end; i++) {
            buffer.putChar(value[RAND.nextInt(value.length)]);
        }

        buffer.flip();

        for (long i = start; i < end; i++) {
            System.out.print(buffer.getChar() + "\t");
        }

        buffer.clear();
    }

}
